#!/usr/bin/env python
# -*-coding: utf-8 -*-
# Filename: editar_estado_intervencion.py

##
# Módulos del sistema
# Parte gráfica
try:
    import pygtk
    pygtk.require("2.0")
    import gtk
    import gtk.glade
except ImportError, error:
    print error
    print "Necesitas la librería gráficas gtk+pygtk"

# Utilidades
from datetime import datetime

##
# Modulos propios
try:
    from lib.funciones_utiles import close, armar_combo, descripcion_valida
    from gui.msj_retroalimentacion import MensajeDeError, MensajeDeNotificacion
except ImportError, error:
    print error
    print "Problemas en editar_estado_intervencion"

class EditarEstadoIntervencion:
    def __init__(self, padre, intervencion):
        self.gladefile = "gui/ghhp.glade"
        self.wTree = gtk.glade.XML(self.gladefile, "EditarEstadoIntervencion")
        self.padre = padre
        self.intervencion = intervencion
        self.window = self.wTree.get_widget("EditarEstadoIntervencion")
        self.window.resize(850, 300)
        self.un_dict = {"on_cancelbutton15_clicked": self.cambio_estado,
                "on_okbutton16_clicked": self.close}
        self.wTree.signal_autoconnect(self.un_dict)
        self.combo_estado = self.wTree.get_widget("combobox10")
        self.combo_estado.set_model(gtk.ListStore(str))
        self.lista_estados = []
        self.armar_combos()
        self.datos_comunes()

    def datos_comunes(self):
        # Estado actual de la intervencion
        # Descripcion del problema
        self.wTree.get_widget("label6").set_text(self.intervencion.estado)
        self.wTree.get_widget("textview8").get_buffer().set_text(
                self.intervencion.ticket.descripcion)

    def armar_combos(self):
        estados = ('', 'Trabajando',
                'Resuelta',
                'Finalizada',
                'En espera por grupo',
                'En espera por trabajar')
        for estado in estados:
            if estado == self.intervencion.estado:
                continue
            else:
                self.combo_estado.append_text(estado)
                self.lista_estados.append(estado)
        self.combo_estado.set_active(0)
        # Ponemos la clasificacion actual como clasificacion por defecto
        self.wTree.get_widget("label212").set_text(
            self.intervencion.ticket.clasificacion_actual.nombre)

    def cambio_estado(self, widget):
        estado, descripcion, bandera = self.datos_validos()
        if bandera:
            if self.cambio_de_estado_valido(estado):
                # Registramos el cambio de estado.
                fecha=datetime.now()
                self.padre.padre.grupo_de_resolucion.actualizar_estado_intervencion(
                        self.intervencion,
                        estado,
                        fecha)
                self.agregar_observacion(descripcion)
                self.cambiar_estado_ticket(estado)
                # Verificamos si hubo cambio de clasificacion
                texto = "Se cambio con éxito el estado de la intervencion"
                msj = MensajeDeNotificacion(texto, self.window)
                if msj.msj.run() == -5:
                    msj.msj.destroy()
                    self.padre.mostrar_resultado(self.padre.lista_intervenciones)
                    self.window.destroy()
        else:
            error = ("Los siguientes datos no pueden ser nulos",
                    "\t- Observacion",
                    "\t- Estado")
            msj = MensajeDeError("\n".join(error), self.window)
            msj.run()

    def agregar_observacion(self, descripcion):
        """Si si  agrega observaciones"""
        grupo = self.padre.padre.grupo_de_resolucion
        usuario = self.padre.padre.usuario_logueado
        self.padre.padre.grupo_de_resolucion.agregar_observacion(self.intervencion,
                descripcion,
                usuario,
                datetime.now(),
                grupo)
    def cambiar_estado_ticket(self, estado):
        """Explicar"""
        usuario = self.padre.padre.usuario_logueado
        self.padre.padre.grupo_de_resolucion.cambiar_estado_ticket(estado,
                usuario,
                self.intervencion)


    def cambio_de_estado_valido(self, estado):
        """Comprueba si se hace un cambio de estado valido.
        La llave representa el estado actual, y el valor son los posibles
        estados que la intervencion puede asumir
        """
        dic = {'Trabajando' : ('Resuelta', 'En espera por grupo', 'Finalizada'),
                'En espera por trabajar': ('Trabajando'),
                'Resuelta': (),
                'Finalizada': (),
                'En espera por grupo': ('Trabajando')}

        if estado in dic.get(self.intervencion.estado):
            return True
        else:
            error = ('El cambio de estado que desea hacer no es posible',
                    'Los cambios son de la siguiente forma:',
                    '\t- Trabajando -> Resuelta, En espera por grupo, Finalizada',
                    '\t- En espera por trabajar -> Trabajando',
                    '\t- Resuelta -> No tiene cambio de estado',
                    '\t- Finalizada -> No tiene cambio de estado',
                    '\t- En espera por grupo -> Trabajando')
            msj = MensajeDeError("\n".join(error), self.window)
            self.combo_estado.set_active(0)
            msj.run()

    def datos_validos(self):
        descripcion = descripcion_valida(self.wTree.get_widget("textview12"))
        estado = self.combo_estado.get_active_text()
        if descripcion and estado:
            return estado, descripcion, True
        else:
            return '','',False

    def close(self, widget):
        close(self.window)

